import os
from moviepy.editor import VideoFileClip


def convert_mp4_to_wav(input_folder, output_folder):
    # 检查输出文件夹是否存在，如果不存在则创建
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    # 遍历输入文件夹及其子文件夹
    for root, dirs, files in os.walk(input_folder):
        # 计算当前子文件夹相对于输入文件夹的相对路径
        relative_path = os.path.relpath(root, input_folder)
        # 构建对应的输出子文件夹路径
        output_subfolder = os.path.join(output_folder, relative_path)
        # 检查输出子文件夹是否存在，如果不存在则创建
        if not os.path.exists(output_subfolder):
            os.makedirs(output_subfolder)

        for file in files:
            if file.endswith('.mp4'):
                # 构建输入文件的完整路径
                input_file_path = os.path.join(root, file)
                # 构建输出文件的完整路径
                output_file_name = os.path.splitext(file)[0] + '.wav'
                output_file_path = os.path.join(output_subfolder, output_file_name)

                try:
                    # 加载视频文件
                    video = VideoFileClip(input_file_path)
                    # 提取音频
                    audio = video.audio
                    # 将音频转换为单声道、16bit、16kHz 的 WAV 格式
                    audio.write_audiofile(output_file_path, fps=16000, nbytes=2, codec='pcm_s16le',
                                          ffmpeg_params=['-ac', '1'])
                    print(f"成功将 {input_file_path} 转换为 {output_file_path}")
                    # 关闭音频和视频对象
                    audio.close()
                    video.close()
                except Exception as e:
                    print(f"转换 {input_file_path} 时出错: {e}")


if __name__ == "__main__":
    input_folder = r"F:\1"
    output_folder = r"F:\中英维"
    convert_mp4_to_wav(input_folder, output_folder)
